package com.wnxy.portal.config;

import com.wnxy.portal.common.constant.RedisConstant;
import com.wnxy.portal.entity.Book;
import com.wnxy.portal.model.vo.BookVo;
import com.wnxy.portal.service.IBookService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 数据预热，初始化库存
 */
@Component
public class StorageCommandLineRunner implements CommandLineRunner {

    @Autowired
    private IBookService bookService;
    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public void run(String... args) throws Exception {
        if (!redisTemplate.hasKey(RedisConstant.STORAGE)) {
            List<Book> list = bookService.list();
            list.forEach(book -> {
                // 问题1：库存为什么存储到Redis中? 生成订单时候，做库存的预扣减，只要扣减redis中库存就可以了
                // 当用户支付完成后，再扣减数据库库存；
                // 如果用户支付失败，就回退Redis中库存即可； 数据库不做任何修改；满足高并发订单生成要求。
                // 问题2：库存存储在Redis中，数据类型？ Hash，更方便获取、操作某一个对象
                // 举例：storage book1 100
                // 举例：storage book2 100
                redisTemplate.opsForHash().put(RedisConstant.STORAGE, book.getId().toString(), book.getStorecount());
            });
        }
    }
}